/*<!--引入jwt-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.10.3</version>
</dependency>*/

package com.easy.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JWTUtil {
	private static final String SIGN = "easy"; // 密钥
	// 1.通过jwt生成token字符串。

	// 创建包含用户名的JWT token
	public static String createToken(String username) {
		// 定义颁发时间
		Date iss = new Date();
		// 过期时间
		Calendar nowTime = Calendar.getInstance();
		nowTime.add(Calendar.DAY_OF_YEAR, 3);
		Date expire = nowTime.getTime();

		// 生成token
		return JWT.create()
				// 载荷种的过期时间
				.withExpiresAt(expire)
				// 颁发时间
				.withIssuedAt(iss)
				// 颁发人
				.withIssuer("easy")
				// 自定义的载荷内容
				.withClaim("username", username)
				// 签名
				.sign(Algorithm.HMAC256(SIGN));
	}


	// 2. 判断token是否合法
	public static boolean verifyToken(String token) {
		JWTVerifier build = JWT.require(Algorithm.HMAC256(SIGN)).build();
		try {
			DecodedJWT verify = build.verify(token);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	// 3. 解析token种的内容
	public static Map<String, Object> decodeJWT(String token) {
		Map<String, Object> userInfo = JWT.decode(token).getClaim("userInfo").asMap();
		return userInfo;
	}

//	public static void main(String[] args) {
//		HashMap<String, Object> map = new HashMap();
//		map.put("name", "zhangsan");
//		map.put("id", 1);
//		map.put("age", 19);
//		String token = createToken(map);
//		System.out.println(token);
//		try {
//			Thread.sleep(4000);
//		} catch (InterruptedException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		boolean bool = verifyToken(token);
//		System.out.println(bool);
//		try {
//			Thread.sleep(200);
//		} catch (InterruptedException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		Map<String, Object> map2 = decodeJWT(token);
//		System.out.println(map2);
//
//	}
}
